Update animation timing after handling scroll input Changes made: - Call update animation timing after updating native scroll/snap animations. This is required to keep scroll animations in sync with scroll offset updates triggered by native scroll animations. - Added tests verifying that scroll timeline is in sync with native scroll animation updates. Bug: 944449 Change-Id: Iee9fad23ef63889f2211bb9257bbd8f583d13175 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2161317 Reviewed-by: Robert Flack <flackr@chromium.org> Reviewed-by: Majid Valipour <majidvp@chromium.org> Commit-Queue: Olga Gerchikov <gerchiko@microsoft.com> Cr-Commit-Position: refs/heads/master@{#764686} 
diff --git a/scroll-animations/scroll-timeline-snapshotting.html b/scroll-animations/scroll-timeline-snapshotting.html new file mode 100644 index 0000000..f2ba23f --- /dev/null +++ b/scroll-animations/scroll-timeline-snapshotting.html 
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>ScrollTimeline snapshotting</title> +<link rel="help" href="https://wicg.github.io/scroll-animations/#avoiding-cycles"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/web-animations/testcommon.js"></script> + +<style> + body { + height: 800px; + width: 800px; + } +</style> +<div id="log"></div> + +<script> +'use strict'; + +promise_test(async t => { + const scroller = document.scrollingElement; + const maxScroll = scroller.scrollHeight - scroller.clientHeight; + const timeline = new ScrollTimeline( + {scrollSource: scroller, timeRange: maxScroll}); + scroller.scrollTo(0, 0); + assert_equals(scroller.scrollTop, 0, "verify test pre-condition"); + + scroller.scrollBy({top:100, behavior:'smooth'}) + // Wait for the scroll to change. + const startScroll = scroller.scrollTop; + do { + await waitForNextFrame(); + } while(scroller.scrollTop == startScroll); + assert_times_equal(timeline.currentTime, scroller.scrollTop, + 'Scroll timeline current time corresponds to the scroll position.'); +}, 'ScrollTimeline current time is updated after programmatic animated scroll.'); + +</script>